123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import typing as t
- if t.TYPE_CHECKING:
- from .runtime import Undefined
- class TemplateError(Exception):
- """Baseclass for all template errors."""
- def __init__(self, message: t.Optional[str] = None) -> None:
- super().__init__(message)
- @property
- def message(self) -> t.Optional[str]:
- return self.args[0] if self.args else None
- class TemplateNotFound(IOError, LookupError, TemplateError):
- """Raised if a template does not exist.
- .. versionchanged:: 2.11
- If the given name is :class:`Undefined` and no message was
- provided, an :exc:`UndefinedError` is raised.
- """
- # Silence the Python warning about message being deprecated since
- # it's not valid here.
- message: t.Optional[str] = None
- def __init__(
- self,
- name: t.Optional[t.Union[str, "Undefined"]],
- message: t.Optional[str] = None,
- ) -> None:
- IOError.__init__(self, name)
- if message is None:
- from .runtime import Undefined
- if isinstance(name, Undefined):
- name._fail_with_undefined_error()
- message = name
- self.message = message
- self.name = name
- self.templates = [name]
- def __str__(self) -> str:
- return str(self.message)
- class TemplatesNotFound(TemplateNotFound):
- """Like :class:`TemplateNotFound` but raised if multiple templates
- are selected. This is a subclass of :class:`TemplateNotFound`
- exception, so just catching the base exception will catch both.
- .. versionchanged:: 2.11
- If a name in the list of names is :class:`Undefined`, a message
- about it being undefined is shown rather than the empty string.
- .. versionadded:: 2.2
- """
- def __init__(
- self,
- names: t.Sequence[t.Union[str, "Undefined"]] = (),
- message: t.Optional[str] = None,
- ) -> None:
- if message is None:
- from .runtime import Undefined
- parts = []
- for name in names:
- if isinstance(name, Undefined):
- parts.append(name._undefined_message)
- else:
- parts.append(name)
- parts_str = ", ".join(map(str, parts))
- message = f"none of the templates given were found: {parts_str}"
- super().__init__(names[-1] if names else None, message)
- self.templates = list(names)
- class TemplateSyntaxError(TemplateError):
- """Raised to tell the user that there is a problem with the template."""
- def __init__(
- self,
- message: str,
- lineno: int,
- name: t.Optional[str] = None,
- filename: t.Optional[str] = None,
- ) -> None:
- super().__init__(message)
- self.lineno = lineno
- self.name = name
- self.filename = filename
- self.source: t.Optional[str] = None
- # this is set to True if the debug.translate_syntax_error
- # function translated the syntax error into a new traceback
- self.translated = False
- def __str__(self) -> str:
- # for translated errors we only return the message
- if self.translated:
- return t.cast(str, self.message)
- # otherwise attach some stuff
- location = f"line {self.lineno}"
- name = self.filename or self.name
- if name:
- location = f'File "{name}", {location}'
- lines = [t.cast(str, self.message), " " + location]
- # if the source is set, add the line to the output
- if self.source is not None:
- try:
- line = self.source.splitlines()[self.lineno - 1]
- except IndexError:
- pass
- else:
- lines.append(" " + line.strip())
- return "\n".join(lines)
- def __reduce__(self): # type: ignore
- # https://bugs.python.org/issue1692335 Exceptions that take
- # multiple required arguments have problems with pickling.
- # Without this, raises TypeError: __init__() missing 1 required
- # positional argument: 'lineno'
- return self.__class__, (self.message, self.lineno, self.name, self.filename)
- class TemplateAssertionError(TemplateSyntaxError):
- """Like a template syntax error, but covers cases where something in the
- template caused an error at compile time that wasn't necessarily caused
- by a syntax error. However it's a direct subclass of
- :exc:`TemplateSyntaxError` and has the same attributes.
- """
- class TemplateRuntimeError(TemplateError):
- """A generic runtime error in the template engine. Under some situations
- Jinja may raise this exception.
- """
- class UndefinedError(TemplateRuntimeError):
- """Raised if a template tries to operate on :class:`Undefined`."""
- class SecurityError(TemplateRuntimeError):
- """Raised if a template tries to do something insecure if the
- sandbox is enabled.
- """
- class FilterArgumentError(TemplateRuntimeError):
- """This error is raised if a filter was called with inappropriate
- arguments
- """
|